package com.nave.segundaguerra.servidorecliente.cliente;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import android.content.Context;
import android.graphics.Point;
import android.graphics.PointF;
import android.util.Log;

import com.nave.segundaguerra.activity.ConnectionSet;
import com.nave.segundaguerra.servidorecliente.servidor.ItemServer;
import com.nave.segundaguerra.servidorecliente.servidor.PlayerServer;
import com.nave.segundaguerra.servidorecliente.util.ActivityUtil;
import com.nave.segundaguerra.servidorecliente.util.BitmapStorage;
import com.nave.segundaguerra.servidorecliente.util.Connection;
import com.nave.segundaguerra.servidorecliente.util.DataHandler;
import com.nave.segundaguerra.servidorecliente.util.ImageLibrary;
import com.nave.segundaguerra.servidorecliente.util.Protocolo;

public class ControleDeUsuarioCliente implements DataHandler {

	private ConcurrentHashMap<String, PlayerCliente> jogadores;
//	private List<TiroCliente> tiroList = new CopyOnWriteArrayList();
	private List<ItemCliente> itemList = new CopyOnWriteArrayList();

	public ControleDeUsuarioCliente() {
		jogadores = new ConcurrentHashMap<String, PlayerCliente>();
	}

	// Receive Server Data
	public void execute(Connection origem, String linha) {

		Log.e("ReciboCliente", linha);
		
		//ActivityUtil.Show(linha);
		
		/*Otimizado
		 if (linha.startsWith(Protocolo.PROTOCOL_ID)) {

			//String[] lista = linha.split(":");
			AdicionarUsuario(origem, linha);
		}
	
		if (linha.startsWith(Protocolo.PROTOCOL_MOVE)) {

			// String[] lista = linha.split(":");
			moveUsuario(origem, linha);
		}*/
		
		if (linha.startsWith(Protocolo.PROTOCOL_MOVE)) {
			
			String[] lista = linha.split(":");
			moveUsuario(origem, lista[1]);
		}
		if (linha.startsWith(Protocolo.PROTOCOL_SHOOT)) {

//			String[] lista = linha.split(":");
//			 moveTiros(origem, lista[1]);
			String[] lista = linha.split(":");
			jogadorAtira(origem,lista[1]);
		}

		if (linha.startsWith(Protocolo.PROTOCOL_ITEM)) {
			// String[] lista = linha.split(":");
			InstantiateCaixa(origem, linha);
		}
		
		if (linha.startsWith(Protocolo.PROTOCOL_UPDATE)) {
			// String[] lista = linha.split(":");
			UpdatePlayer(origem, linha);
		}
	}

	private void jogadorAtira(Connection origem, String linha) {
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			String nome = separado[0];
			int x = Integer.parseInt(separado[1]);
			int y = Integer.parseInt(separado[2]);
			Log.i("Jogador", "Nome: " + nome);
			
			PlayerCliente jogador = jogadores.get(nome);
			if(jogador != null){
			jogador.setDestinationTiro(new Point(x,y));
			jogador.setRotateImageTiro(true);
			//Log.i("Destination", "x: " + jogador.getDestination().x)
			jogador.Atirou(true);
			}
		}
	}

	public void sendPosition(String name, PointF point)
	{
		
		
	}
	/* Otimizado
	//Adicionar Usuario no Jogo
	public void AdicionarUsuario(Connection origem, String linha) {
		
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			String nome = separado[1];
			float x = Float.parseFloat(separado[2]);
			float y = Float.parseFloat(separado[3]);
			int right = Integer.parseInt(separado[4]);
			int bottom = Integer.parseInt(separado[5]);
			String time = separado[6];
			String classe = separado[7];
			
			Log.i("Cliente", classe);
			PlayerCliente jogador = selecionarPlayerCliente(classe, nome, new PointF(x,y), new Point(right,bottom));
			Log.i("Cliente2", jogador.getMinhaClasse());
			jogador.setTime(time);
			jogadores.put(nome, jogador);
		}
	}
	private PlayerCliente selecionarPlayerCliente(String classe, String nome,
			PointF position, Point dimensoes) {

		if (classe.equals("General")) {
			GeneralCliente general = new GeneralCliente(nome, position);
			return general;
		} else if (classe.equals("Soldado")) {
			SoldadoCliente soldado = new SoldadoCliente(nome, position);
			soldado.setImage(ImageLibrary.getInstance().getImage("Soldado"), dimensoes.x, dimensoes.y);
			return soldado;
		} else {
			MedicoCliente medico = new MedicoCliente(nome, position);
			medico.setImage(ImageLibrary.getInstance().getImage("Medico"), dimensoes.x, dimensoes.y);
			return medico;
		}
	}
	
	// Mover Usuario no Jogo
	public void moveUsuario(Connection origem, String linha) {
		
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			String nome = separado[1];
			float x = Float.parseFloat(separado[2]);
			float y = Float.parseFloat(separado[3]);
			float desX = Float.parseFloat(separado[4]);
			float desY = Float.parseFloat(separado[5]);
			
			PlayerCliente jogador = jogadores.get(nome);
			if (jogador != null) {
				jogador.setPosition(new PointF(x, y));
				jogador.setDestination(new PointF(desX,desY));
				jogador.setRotateImage(true);
			} 
		}
	}*/

	// Nao otimizado
	public void moveUsuario(Connection origem, String linha) {
		Log.i("Log", linha);
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			String nome = separado[0];
			float x = Float.parseFloat(separado[1]);
			float y = Float.parseFloat(separado[2]);
			float desX = Float.parseFloat(separado[3]);
			float desY = Float.parseFloat(separado[4]);
			int right = Integer.parseInt(separado[5]);
			int bottom = Integer.parseInt(separado[6]);
			String time = separado[7];
			String classe = separado[8];
			
			PlayerCliente jogador = jogadores.get(nome);
			if (jogador == null) {
				//jogador = new SoldadoCliente(nome, new Point(x, y));
				jogador = selecionarPlayerCliente(classe, nome, new PointF(x, y), new Point(right,bottom));
				jogador.setTime(time);
				jogadores.put(nome, jogador);
			} else {
				//jogador.setX(x);
				//jogador.setY(y);
				jogador.setPosition(new PointF(x,y));
				jogador.setDestination(new PointF(desX,desY));
				jogador.setRotateImage(true);
			}
		}
	}
	private PlayerCliente selecionarPlayerCliente(String classe, String nome,
			PointF position, Point dimensoes) {

		if (classe.equals("General")) {
			GeneralCliente general = new GeneralCliente(nome, position);
			return general;
		} else if (classe.equals("Soldado")) {
			SoldadoCliente soldado = new SoldadoCliente(nome, position);
			soldado.setImage(BitmapStorage.getInstance().getSoldado(), dimensoes.x, dimensoes.y);
			soldado.setTiro(BitmapStorage.getInstance().getTiro(), BitmapStorage.getInstance().getTiro().getWidth(), BitmapStorage.getInstance().getTiro().getHeight());
			return soldado;
		} else {
			MedicoCliente medico = new MedicoCliente(nome, position);
			medico.setImage(BitmapStorage.getInstance().getMedico(), dimensoes.x, dimensoes.y);
			return medico;
		}
	}
	
	/*
	//Move tiros
	public void moveTiros(Connection origem, String linha) {

		Log.i("Linha do tiro:", linha);
		tiroList.clear();
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			float x = Float.parseFloat(separado[0]);

			float y = Float.parseFloat(separado[1]);

//			tiroList.add(i, new TiroCliente(new Point(x, y)));
//			i++;
			tiroList.add(new TiroCliente(new PointF(x, y)));
		}
	}
	*/
	
	//Adiciona caixa
	public void InstantiateCaixa(Connection origem, String linha) {
		String[] array = linha.split(",");

		Log.i("Caixa !", linha);
		String nome = array[0];
		int x = Integer.parseInt(array[1]);
		int y = Integer.parseInt(array[2]);
		ItemCliente item = new ItemCliente(new Point(x, y), nome);
		itemList.add(item);
	}
	
	public void UpdatePlayer(Connection origem, String linha){
		String[] lista = linha.split(";");
		for (String um : lista) {
			String[] separado = um.split(",");
			String nome = separado[1];
			int vida = Integer.parseInt(separado[2]);
			int municao = Integer.parseInt(separado[3]);
			int bala = Integer.parseInt(separado[4]);
			//int pontos = Integer.parseInt(separado[4]);
			PlayerCliente jogador = jogadores.get(nome);
			jogador.setVida(vida);
			jogador.setMunicao(municao);
			jogador.setBalas(bala);
			//jogador.setPontos(pontos);
		}
	}
	// GETTERS AND SETTERS
	public ConcurrentHashMap<String, PlayerCliente> getJogadores() {
		return jogadores;
	}
//	public List<TiroCliente> getListTiros() {
//		return this.tiroList;
//	}
	public List<ItemCliente> getItemList() {
		return this.itemList;
	}
}
